#!/bin/bash

# Slackware build script for clksignal-roms

# Written by B. Watson (urchlay@slackware.uk)

# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.

# I don't host any of the DOWNLOAD files (except the oric color
# palette). ROM sites tend to come and go, so at some point the
# download links will likely break. Let me know if this happens.

# To clean up the directory:
# rm -f *.rom *.ROM *.img *.zip *.chr basic chargen kernal dos154*

# 20230114 bkw:
# - add apple2gs.chr
# - add tos104uk.img
# - update STATUS.txt

cd $(dirname $0) ; CWD=$(pwd)

PRGNAM=clksignal-roms
VERSION=${VERSION:-20230114}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}

ARCH=noarch

if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
  echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
  exit 0
fi

TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

set -e

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
mkdir -p $PRGNAM-$VERSION
cd $PRGNAM-$VERSION

install_rom() {
  install -m0644 -oroot -groot "$1" "$2"
}

ROMBASE=$PKG/usr/share/CLK
set_dest() {
  DEST="$ROMBASE/$1"
  mkdir -p "$DEST"
}

###### Apple II series ROMs, including the Disk II and IIgs.
set_dest AppleII

# wheels within wheels, plans within plans, zipfiles within zipfiles...
unzip $CWD/apple2_roms.zip apple.rom apple2o.rom 13-sector-disk-ii-roms.zip \
  apple_iie_rom.zip apple_2e_unenhanced_rom.zip ROMS.ZIP
unzip apple_iie_rom.zip APPLE2E.ROM
unzip apple_2e_unenhanced_rom.zip
unzip ROMS.ZIP 3410036.BIN 3420028A.BIN 3410027A.BIN

install_rom apple.rom $DEST/apple2.rom
install_rom apple2o.rom $DEST/apple2o.rom
install_rom APPLE2E.ROM $DEST/apple2e.rom
install_rom apple2eu.rom $DEST/apple2eu.rom
install_rom 3410036.BIN $DEST/apple2-character.rom

unzip $CWD/apple2ee.zip
install_rom 3420265a.chr $DEST/apple2e-character.rom

# CRC doesn't match, but the machine starts and seems to work
# correctly.
unzip $CWD/apple2e.zip 3420133a.chr
install_rom 3420133a.chr $DEST/apple2eu-character.rom

set_dest DiskII
install_rom 3410027A.BIN $DEST/boot-16.rom
install_rom 3420028A.BIN $DEST/state-machine-16.rom

unzip 13-sector-disk-ii-roms.zip '*.bin'
install_rom 13-sector-disk-ii-boot-rom.bin $DEST/boot-13.rom
install_rom 13-sector-disk-ii-state-machine-rom.bin $DEST/state-machine-13.rom

set_dest AppleIIgs
Z="$CWD/MESS 0.151 ROMs%2Fapple2gs.zip"
[ -e "$Z" ] || Z="$CWD/MESS%200.151%20ROMs%2Fapple2gs.zip"
[ -e "$Z" ] || Z="$CWD/apple2gs.zip"
unzip "$Z"

# Only include the ROM03 firmware.
# According to the CRC, this is an 'alternate' (or anyway, it's the 2nd
# of two known CRCs).
# Doesn't really matter: clksignal segfaults on trying to start up
# with --new=appleiigs.
cat 341-0737 341-0748 > rom03
install_rom rom03 $DEST/apple2gs.rom2
install_rom 341s0632-2.bin $DEST/341s0632-2
install_rom apple2gs.chr $DEST/apple2gs.chr

###### Commodore VIC-20 and 1540/1541 ROMs
# only English and PAL for now.
set_dest Vic20
install_rom $CWD/basic $DEST/basic.bin
install_rom $CWD/kernal $DEST/kernel-pal.bin
install_rom $CWD/chargen $DEST/characters-english.bin

# the 1541 isn't yet emulated by clksignal...
set_dest Commodore1540
install_rom $CWD/dos1540 $DEST/1540.bin
install_rom $CWD/dos1541 $DEST/1541.bin

###### Atari ST
set_dest AtariST
unzip $CWD/tos100uk.zip
install_rom tos100uk.img $DEST/tos100.img
unzip $CWD/tos104uk.zip
install_rom tos104uk.img $DEST/tos104.img

###### Colecovision
set_dest ColecoVision
unzip $CWD/coleco.zip
install_rom coleco.rom $DEST/coleco.rom

##### Amiga
# handle filename with spaces (wget) or hex escapes (curl -O, some browsers).
set_dest Amiga
Z="$CWD/Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV).rom"
if [ ! -e "$Z" ]; then
  Z="$CWD/Kickstart%20v1.3%20rev%2034.5%20%281987%29%28Commodore%29%28A500-A1000-A2000-CDTV%29.rom"
fi
install_rom "$Z" $DEST/Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom

##### Amstrad CPC
set_dest AmstradCPC

# firmware and BASIC are combined, split 'em apart with dd.
unzip $CWD/cpc464.zip
dd if=cpc464.rom of=$DEST/os464.rom bs=16k count=1
dd if=cpc464.rom of=$DEST/basic464.rom bs=16k count=1 skip=1
install_rom cpcados.rom $DEST/amsdos.rom

unzip $CWD/cpc664.zip
dd if=cpc664.rom of=$DEST/os664.rom bs=16k count=1
dd if=cpc664.rom of=$DEST/basic664.rom bs=16k count=1 skip=1

unzip $CWD/cpc6128.zip
dd if=cpc6128.rom of=$DEST/os6128.rom bs=16k count=1
dd if=cpc6128.rom of=$DEST/basic6128.rom bs=16k count=1 skip=1

##### Electron
set_dest Electron
unzip $CWD/electron.zip
install_rom basic.rom $DEST/basic.rom
install_rom os.rom $DEST/os.rom

##### Macintosh
set_dest Macintosh
unzip $CWD/mac128k.zip
unzip $CWD/mac512k.zip
unzip $CWD/macplus.zip
install_rom mac128k.rom $DEST/mac128k.rom
install_rom mac512k.rom $DEST/mac512k.rom
install_rom macplus.rom $DEST/macplus.rom

##### Sega Master System
set_dest MasterSystem
unzip $CWD/sms1pal.zip bios13fx.rom
unzip $CWD/smsj.zip jbios21.rom
install_rom bios13fx.rom $DEST/bios.sms
install_rom jbios21.rom $DEST/japanese-bios.sms

##### Enterprise
set_dest Enterprise
Z="$CWD/MESS 0.151 ROMs%2Fep64.zip"
[ ! -e "$Z" ] && Z="$CWD/MESS%200.151%20ROMs%2Fep64.zip"
[ ! -e "$Z" ] && Z="$CWD/ep64.zip"
unzip "$Z"
install_rom 9256ds-0038_enter05-23-a.u2 $DEST/exos20.bin

##### MSX. "any MSX BIOS", whatever that means.
set_dest MSX
install_rom $CWD/MSX.ROM $DEST/msx.rom
install_rom $CWD/DISK.ROM $DEST/disk.rom

##### Oric
# only have 2 of the 4 disk interfaces and 2 of the 3 BASIC ROMs.
# oric-pal-prom.zip originally came from
# https://forum.defence-force.org/viewtopic.php?f=8&t=2248&hilit=colour+rom&start=15
# ...and isn't copyrighted AFAIK.
set_dest Oric
unzip $CWD/oric1.zip
unzip $CWD/orica.zip
unzip $CWD/oric-pal-prom.zip
install_rom basic10.rom $DEST/basic10.rom
install_rom basic11b.rom $DEST/basic11.rom
install_rom jasmin.rom $DEST/jasmin.rom
install_rom microdis.rom $DEST/microdisc.rom
install_rom tbp24s10n.bin $DEST/colour.rom

##### ZX80/81
set_dest ZX8081
unzip $CWD/zx80.zip zx80.rom
unzip $CWD/zx81.zip zx81a.rom
install_rom zx80.rom $DEST/zx80.rom
install_rom zx81a.rom $DEST/zx81.rom

# No docs, include our own.
PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
mkdir -p $PKGDOC
cat $CWD/README > $PKGDOC/README.txt
cat $CWD/STATUS.txt > $PKGDOC/STATUS.txt
cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
